##Copyright 2010 Alejandro Merlo Serrano, David Saldaña López

##This program is free software: you can redistribute it and/or modify it
##under the terms of the GNU General Public License as published by the
##Free Software Foundation, either version 3 of the License,
##or (at your option) any later version.

##This program is distributed in the hope that it will be useful, but
##WITHOUT ANY WARRANTY; without even the implied warranty of
##MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
##See the GNU General Public License for more details.

##You should have received a copy of the GNU General Public License
##along with this program. If not, see <http://www.gnu.org/licenses/>


### 
###  gcc -I./ -L./lib -Wall -O2 -lSDL -lSDL_ttf -o  buscaminas  sdl_simple.c  buscaminas.s
### 

.include "sdl_simple.s"

.set SCREEN_WIDTH,310
.set SCREEN_HEIGHT,372
.set SCREEN_BPP,32
.set SCREEN_BPP_SHL,2
.set FULL_SCREEN,0

.data
	titulo_ventana: .string "Buscaminas"
	
	## Inicializacion de las variables de las imagenes y fuentes
	font_file: .string "./data/ttf/TransponderAOE.ttf"
	fondo_file: .string "./data/img/fondo.bmp"
	abierta: .string "./data/img/vacia.bmp"
	cerrada: .string "./data/img/cerrada.bmp"
	bandera: .string "./data/img/bandera.bmp"
	uno: .string "./data/img/uno.bmp"
	dos: .string "./data/img/dos.bmp"
	tres: .string "./data/img/tres.bmp"
	cuatro: .string "./data/img/cuatro.bmp"
	cinco: .string "./data/img/cinco.bmp"
	seis: .string "./data/img/seis.bmp"
	siete: .string "./data/img/siete.bmp"
	ocho: .string "./data/img/ocho.bmp"
	mina: .string "./data/img/mina.bmp"

	## Inicializacion del vector
	array: .int 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
	tam_array: .int 100
	
	## Inicializacion de las variables numericas
	num_minas: .int 13
	indice_x: .int 0
	indice_y: .int 0
	x: .int 0
	y: .int 0
	boton: .int 0
	i: .int 0
	j: .int 0
	count: .int 0
	recursion: .int 0
		
.text

.include "funciones.s"

# main : programa principal
.globl main
main:
	pushl %ebp
	movl %esp, %ebp

	## inicializar la ventana gráfica usando la función INIT_SDL
	pushl $FULL_SCREEN
	pushl $SCREEN_BPP
	pushl $SCREEN_HEIGHT
	pushl $SCREEN_WIDTH
	call init_sdl
	addl $16, %esp

	pushl $titulo_ventana
	call set_caption
	addl $4, %esp
	
	## cargamos la imagen de fondo del tablero
	pushl $0
	pushl $0
	pushl $fondo_file
	pushl %eax
	call print_IMG
	addl $16, %esp

	## Inicializamos las minas aleatoriamente en el tablero
	call init_rand

	movl (num_minas), %esi
	inicializacion:
		pushl %eax
		call gen_rand
		addl $4, %esp
		cmpl $9, array(,%eax,4)
		je inicializacion
			movl $9, array(,%eax,4)
	decl %esi
	cmpl $0, %esi
	ja inicializacion

	## Inicializamos el resto del tablero
	movl $0, %esi
	for_i:
		movl %esi, (i)
		movl $0, (j)
		cmpl $0, (i)
		jne no_esq_sup_izq
			#ESQUINA SUPERIOR IZQUIERDA
			movl (i), %eax
			movl $10, %ebx
			mull %ebx
			addl (j), %eax
			cmpl $9, array(,%eax,4)
			je fin_lado_izq
				movl %eax, %ecx
				addl $1, %ecx
				cmpl $9, array(,%ecx,4)
				jne no_drch_1
					incl array(,%eax,4)
				no_drch_1:
				addl $9, %ecx
				cmpl $9, array(,%ecx,4)
				jne no_abajo_1
					incl array(,%eax,4)
				no_abajo_1:
				addl $1, %ecx
				cmpl $9, array(,%ecx,4)
				jne no_abajo_drch_1
					incl array(,%eax,4)
				no_abajo_drch_1:
			jmp fin_lado_izq
		no_esq_sup_izq:
		cmpl $9, (i)
		jne no_esq_inf_izq
			#ESQUINA INFERIOR IZQUIERDA
			movl (i), %eax
			movl $10, %ebx
			mull %ebx
			addl (j), %eax
			cmpl $9, array(,%eax,4)
			je fin_lado_izq
				movl %eax, %ecx
				subl $10, %ecx
				cmpl $9, array(,%ecx,4)
				jne no_arriba_1
					incl array(,%eax,4)
				no_arriba_1:
				addl $1, %ecx
				cmpl $9, array(,%ecx,4)
				jne no_arriba_drch_1
					incl array(,%eax,4)
				no_arriba_drch_1:
				addl $10, %ecx
				cmpl $9, array(,%ecx,4)
				jne no_drch_2
					incl array(,%eax,4)
				no_drch_2:
			jmp fin_lado_izq
		no_esq_inf_izq:
			#BORDE IZQUIERDO
			movl (i), %eax
			movl $10, %ebx
			mull %ebx
			addl (j), %eax
			cmpl $9, array(,%eax,4)
			je fin_lado_izq
				movl %eax, %ecx
				subl $10, %ecx
				cmpl $9, array(,%ecx,4)
				jne no_arriba_2
					incl array(,%eax,4)
				no_arriba_2:
				addl $1, %ecx
				cmpl $9, array(,%ecx,4)
				jne no_arriba_drch_2
					incl array(,%eax,4)
				no_arriba_drch_2:
				addl $10, %ecx
				cmpl $9, array(,%ecx,4)
				jne no_drch_3
					incl array(,%eax,4)
				no_drch_3:
				addl $9, %ecx
				cmpl $9, array(,%ecx,4)
				jne no_abajo_2
					incl array(,%eax,4)
				no_abajo_2:
				addl $1, %ecx
				cmpl $9, array(,%ecx,4)
				jne no_abajo_drch_2
					incl array(,%eax,4)
				no_abajo_drch_2:
		fin_lado_izq:
		
		pushl %esi
		movl $1, %esi
		for_j:
			movl %esi, (j)
			cmpl $0, (i)
			jne no_lado_sup
				#BORDE SUPERIOR
				movl (i), %eax
				movl $10, %ebx
				mull %ebx
				addl (j), %eax
				cmpl $9, array(,%eax,4)
				je fin_centro
					movl %eax, %ecx
					subl $1, %ecx
					cmpl $9, array(,%ecx,4)
					jne no_izq_1
						incl array(,%eax,4)
					no_izq_1:
					addl $2, %ecx
					cmpl $9, array(,%ecx,4)
					jne no_drch_4
						incl array(,%eax,4)
					no_drch_4:
					addl $8, %ecx
					cmpl $9, array(,%ecx,4)
					jne no_abajo_izq_1
						incl array(,%eax,4)
					no_abajo_izq_1:
					addl $1, %ecx
					cmpl $9, array(,%ecx,4)
					jne no_abajo_3
						incl array(,%eax,4)
					no_abajo_3:
					addl $1, %ecx
					cmpl $9, array(,%ecx,4)
					jne no_abajo_drch_3
						incl array(,%eax,4)
					no_abajo_drch_3:
				jmp fin_centro
			no_lado_sup:
			cmpl $9, (i)
			jne no_lado_inf
				#BORDE INFERIOR
				movl (i), %eax
				movl $10, %ebx
				mull %ebx
				addl (j), %eax
				cmpl $9, array(,%eax,4)
				je fin_centro
					movl %eax, %ecx
					subl $1, %ecx
					cmpl $9, array(,%ecx,4)
					jne no_izq_2
						incl array(,%eax,4)
					no_izq_2:
					subl $10, %ecx
					cmpl $9, array(,%ecx,4)
					jne no_arriba_izq_1
						incl array(,%eax,4)
					no_arriba_izq_1:
					addl $1, %ecx
					cmpl $9, array(,%ecx,4)
					jne no_arriba_3
						incl array(,%eax,4)
					no_arriba_3:
					addl $1, %ecx
					cmpl $9, array(,%ecx,4)
					jne no_arriba_drch_3
						incl array(,%eax,4)
					no_arriba_drch_3:
					addl $10, %ecx
					cmpl $9, array(,%ecx,4)
					jne no_drch_5
						incl array(,%eax,4)
					no_drch_5:
				jmp fin_centro
			no_lado_inf:
				#ZONA CENTRAL
				movl (i), %eax
				movl $10, %ebx
				mull %ebx
				addl (j), %eax
				cmpl $9, array(,%eax,4)
				je fin_centro
					movl %eax, %ecx
					subl $11, %ecx
					cmpl $9, array(,%ecx,4)
					jne no_arriba_izq_2
						incl array(,%eax,4)
					no_arriba_izq_2:
					addl $1, %ecx
					cmpl $9, array(,%ecx,4)
					jne no_arriba_4
						incl array(,%eax,4)
					no_arriba_4:
					addl $1, %ecx
					cmpl $9, array(,%ecx,4)
					jne no_arriba_drch_4
						incl array(,%eax,4)
					no_arriba_drch_4:
					addl $8, %ecx
					cmpl $9, array(,%ecx,4)
					jne no_izq_3
						incl array(,%eax,4)
					no_izq_3:
					addl $2, %ecx
					cmpl $9, array(,%ecx,4)
					jne no_drch_6
						incl array(,%eax,4)
					no_drch_6:
					addl $8, %ecx
					cmpl $9, array(,%ecx,4)
					jne no_abajo_izq_2
						incl array(,%eax,4)
					no_abajo_izq_2:
					addl $1, %ecx
					cmpl $9, array(,%ecx,4)
					jne no_abajo_4
						incl array(,%eax,4)
					no_abajo_4:
					addl $1, %ecx
					cmpl $9, array(,%ecx,4)
					jne no_abajo_drch_4
						incl array(,%eax,4)
					no_abajo_drch_4:
			fin_centro:
			
			incl %esi
			cmpl $9, %esi
			jne for_j
		popl %esi
		
		movl $9, (j)
		cmpl $0, (i)
		jne no_esq_sup_drch
			#ESQUINA SUPERIOR DERECHA
			movl (i), %eax
			movl $10, %ebx
			mull %ebx
			addl (j), %eax
			cmpl $9, array(,%eax,4)
			je fin_lado_drch
				movl %eax, %ecx
				subl $1, %ecx
				cmpl $9, array(,%ecx,4)
				jne no_izq_4
					incl array(,%eax,4)
				no_izq_4:
				addl $10, %ecx
				cmpl $9, array(,%ecx,4)
				jne no_abajo_izq_3
					incl array(,%eax,4)
				no_abajo_izq_3:
				addl $1, %ecx
				cmpl $9, array(,%ecx,4)
				jne no_abajo_5
					incl array(,%eax,4)
				no_abajo_5:
			jmp fin_lado_drch
		no_esq_sup_drch:
		cmpl $9, (i)
		jne no_esq_inf_drch
			#ESQUINA INFERIOR DERECHA
			movl (i), %eax
			movl $10, %ebx
			mull %ebx
			addl (j), %eax
			cmpl $9, array(,%eax,4)
			je fin_lado_drch
				movl %eax, %ecx
				subl $1, %ecx
				cmpl $9, array(,%ecx,4)
				jne no_izq_5
					incl array(,%eax,4)
				no_izq_5:
				subl $10, %ecx
				cmpl $9, array(,%ecx,4)
				jne no_arriba_izq_3
					incl array(,%eax,4)
				no_arriba_izq_3:
				addl $1, %ecx
				cmpl $9, array(,%ecx,4)
				jne no_arriba_5
					incl array(,%eax,4)
				no_arriba_5:
			jmp fin_lado_drch
		no_esq_inf_drch:
			#BORDE DERECHO
			movl (i), %eax
			movl $10, %ebx
			mull %ebx
			addl (j), %eax
			cmpl $9, array(,%eax,4)
			je fin_lado_drch
				movl %eax, %ecx
				subl $10, %ecx
				cmpl $9, array(,%ecx,4)
				jne no_arriba_6
					incl array(,%eax,4)
				no_arriba_6:
				subl $1, %ecx
				cmpl $9, array(,%ecx,4)
				jne no_arriba_izq_4
					incl array(,%eax,4)
				no_arriba_izq_4:
				addl $10, %ecx
				cmpl $9, array(,%ecx,4)
				jne no_izq_6
					incl array(,%eax,4)
				no_izq_6:
				addl $10, %ecx
				cmpl $9, array(,%ecx,4)
				jne no_abajo_izq_4
					incl array(,%eax,4)
				no_abajo_izq_4:
				addl $1, %ecx
				cmpl $9, array(,%ecx,4)
				jne no_abajo_6
					incl array(,%eax,4)
				no_abajo_6:
		fin_lado_drch:
		
	incl %esi
	cmpl $10, %esi
	jne for_i

	## Actualizamos la ventana	
	call update_screen

	## Bucle del juego
no_cierra_ventana:
	###################Actualizar Marcadores###################
	
	## Actualizamos la ventana	
	call update_screen
	## Esperamos un evento de entrada
	call wait_event
	call get_event_type
	cmpl $EV_QUIT, %eax
	je terminar

	## Comprobamos en que casilla hemos clickado
	cmpl $EV_MOUSE_DOWN, %eax
	jne no_cierra_ventana

	call get_mouse_motion_x
	movl %eax , (x)
	call get_mouse_motion_y
	movl %eax , (y)
	call get_mouse_button
	movl %eax, (boton)

	## Comprobamos en que columna hemos clickado
	cmpl $31, (x)
	ja no_columna1
		movl $0, (indice_x)
		jmp fin_x
no_columna1:
	cmpl $62, (x)
	ja no_columna2
		movl $1, (indice_x)
		jmp fin_x
no_columna2:
	cmpl $93, (x)
	ja no_columna3
		movl $2, (indice_x)
		jmp fin_x
no_columna3:
	cmpl $124, (x)
	ja no_columna4
		movl $3, (indice_x)
		jmp fin_x
no_columna4:
	cmpl $155, (x)
	ja no_columna5
		movl $4, (indice_x)
		jmp fin_x
no_columna5:
	cmpl $186, (x)
	ja no_columna6
		movl $5, (indice_x)
		jmp fin_x
no_columna6:
	cmpl $217, (x)
	ja no_columna7
		movl $6, (indice_x)
		jmp fin_x
no_columna7:
	cmpl $248, (x)
	ja no_columna8
		movl $7, (indice_x)
		jmp fin_x
no_columna8:
	cmpl $279, (x)
	ja no_columna9
		movl $8, (indice_x)
		jmp fin_x
no_columna9:
	cmpl $310, (x)
	ja fin_x
		movl $9, (indice_x)
fin_x:

	## Comprobamos en que fila hemos clickado
	cmpl $15, (y)
	ja no_fila0
		jmp no_cierra_ventana
no_fila0:
	cmpl $46, (y)
	ja no_fila1
		movl $0, (indice_y)
		jmp fin_y
no_fila1:
	cmpl $77, (y)
	ja no_fila2
		movl $1, (indice_y)
		jmp fin_y
no_fila2:
	cmpl $108, (y)
	ja no_fila3
		movl $2, (indice_y)
		jmp fin_y
no_fila3:
	cmpl $139, (y)
	ja no_fila4
		movl $3, (indice_y)
		jmp fin_y
no_fila4:
	cmpl $170, (y)
	ja no_fila5
		movl $4, (indice_y)
		jmp fin_y
no_fila5:
	cmpl $201, (y)
	ja no_fila6
		movl $5, (indice_y)
		jmp fin_y
no_fila6:
	cmpl $232, (y)
	ja no_fila7
		movl $6, (indice_y)
		jmp fin_y
no_fila7:
	cmpl $263, (y)
	ja no_fila8
		movl $7, (indice_y)
		jmp fin_y
no_fila8:
	cmpl $294, (y)
	ja no_fila9
		movl $8, (indice_y)
		jmp fin_y
no_fila9:
	cmpl $325, (y)
	ja no_cierra_ventana
		movl $9, (indice_y)
fin_y:

	## Calculamos las coordenadas donde tenemos que dibujar la imagen
	movl (indice_x), %eax
	movl $31, %ebx
	mull %ebx
	movl %eax, (i)
	
	movl (indice_y), %eax
	movl $31, %ebx
	mull %ebx
	addl $15, %eax
	movl %eax, (j)

	## Comprobamos que boton hemos clickado
	cmpl $1, (boton)
	jne boton_derecho
		## Si hemos clickado con el boton izquierdo:
		
		## Descubrimos el numero que hay en la casilla clickada
		########################################### MAL ###########################################
		#recursividad:
		#cmpl $0, (recursion)
		#je no_recursividad
			#............................
		
		#no_recursividad:
		########################################### /MAL ##########################################
		## Calculamos el indice del vector en el que hemos clickado
		movl (indice_y), %eax
		movl $10, %ebx
		mull %ebx
		addl (indice_x), %eax
		movl %eax, %esi
		
		## Calculamos las coordenadas donde tenemos que dibujar la imagen
		movl (indice_x), %eax
		movl $31, %ebx
		mull %ebx
		movl %eax, (i)
		
		movl (indice_y), %eax
		movl $31, %ebx
		mull %ebx
		addl $15, %eax
		movl %eax, (j)
		
		cmpl $0, array(,%esi,4)
		jne no_num_0
			## Dibujamos la casilla abierta	
			pushl (j)
			pushl (i)
			pushl $abierta
			pushl %eax
			call print_IMG
			addl $16, %esp

			addl $10, array(,%esi,4)
			
			## Comprobamos recursivamente las 4 casillas adyacentes
			## Si estamos en la primera columna:
			cmpl $0, (indice_x)
			jne no_col0
				## Si estamos en la primera fila:
				cmpl $0, (indice_y)
				jne no_col0_fil0
					#............................
					jmp fin_boton		# Provisional
				no_col0_fil0:
				## Si estamos en la ultima fila:
				cmpl $9, (indice_y)
				jne no_col0_fil9
					#............................
					jmp fin_boton		# Provisional
				no_col0_fil9:
				## Si estamos en las filas intermedias:
					#............................
					jmp fin_boton		# Provisional
			no_col0:
			## Si estamos en la ultima columna:
			cmpl $9, (indice_x)
			jne no_col9
				## Si estamos en la primera fila:
				cmpl $0, (indice_y)
				jne no_col9_fil0
					#............................
					jmp fin_boton		# Provisional
				no_col9_fil0:
				## Si estamos en la ultima fila:
				cmpl $9, (indice_y)
				jne no_col9_fil9
					#............................
					jmp fin_boton		# Provisional
				no_col9_fil9:
				## Si estamos en las filas intermedias:
					#............................
					jmp fin_boton		# Provisional
			no_col9:
			## Si estamos en las columnas intermedias:
				## Si estamos en la primera fila:
				cmpl $0, (indice_y)
				jne no_fil0
					#............................
					jmp fin_boton		# Provisional
				no_fil0:
				## Si estamos en la ultima fila:
				cmpl $9, (indice_y)
				jne no_fil9
					#............................
					jmp fin_boton		# Provisional
				no_fil9:
				## Si estamos en las filas intermedias:
					#............................
					jmp fin_boton		# Provisional
			
		no_num_0:
		cmpl $1, array(,%esi,4)
		jne no_num_1
			## Dibujamos la casilla abierta con numero 1
			pushl (j)
			pushl (i)
			pushl $uno
			pushl %eax
			call print_IMG
			addl $16, %esp
			
			addl $10, array(,%esi,4)
			jmp fin_boton
		no_num_1:
		cmpl $2, array(,%esi,4)
		jne no_num_2
			## Dibujamos la casilla abierta con numero 2
			pushl (j)
			pushl (i)
			pushl $dos
			pushl %eax
			call print_IMG
			addl $16, %esp
			
			addl $10, array(,%esi,4)
			jmp fin_boton
		no_num_2:
		cmpl $3, array(,%esi,4)
		jne no_num_3
			## Dibujamos la casilla abierta con numero 3
			pushl (j)
			pushl (i)
			pushl $tres
			pushl %eax
			call print_IMG
			addl $16, %esp
			
			addl $10, array(,%esi,4)
			jmp fin_boton
		no_num_3:
		cmpl $4, array(,%esi,4)
		jne no_num_4
			## Dibujamos la casilla abierta con numero 4
			pushl (j)
			pushl (i)
			pushl $cuatro
			pushl %eax
			call print_IMG
			addl $16, %esp
			
			addl $10, array(,%esi,4)
			jmp fin_boton
		no_num_4:
		cmpl $5, array(,%esi,4)
		jne no_num_5
			## Dibujamos la casilla abierta con numero 5
			pushl (j)
			pushl (i)
			pushl $cinco
			pushl %eax
			call print_IMG
			addl $16, %esp
			
			addl $10, array(,%esi,4)
			jmp fin_boton
		no_num_5:
		cmpl $6, array(,%esi,4)
		jne no_num_6
			## Dibujamos la casilla abierta con numero 6
			pushl (j)
			pushl (i)
			pushl $seis
			pushl %eax
			call print_IMG
			addl $16, %esp
			
			addl $10, array(,%esi,4)
			jmp fin_boton
		no_num_6:
		cmpl $7, array(,%esi,4)
		jne no_num_7
			## Dibujamos la casilla abierta con numero 7
			pushl (j)
			pushl (i)
			pushl $siete
			pushl %eax
			call print_IMG
			addl $16, %esp
			
			addl $10, array(,%esi,4)
			jmp fin_boton
		no_num_7:
		cmpl $8, array(,%esi,4)
		jne no_num_8
			## Dibujamos la casilla abierta con numero 8
			pushl (j)
			pushl (i)
			pushl $ocho
			pushl %eax
			call print_IMG
			addl $16, %esp
			
			addl $10, array(,%esi,4)
			jmp fin_boton
		no_num_8:
		cmpl $9, array(,%esi,4)
		jne fin_boton
			## Dibujamos la casilla abierta con la mina
			pushl (j)
			pushl (i)
			pushl $mina
			pushl %eax
			call print_IMG
			addl $16, %esp
			
			addl $10, array(,%esi,4)
			jmp fin_boton
			
			##################### Dibujar todas las minas (¿?) y GAME OVER #####################
	jmp fin_boton

boton_derecho:
	cmpl $3, (boton)
	jne fin_boton
		## Si hemos clickado con el boton derecho:
		movl (indice_y), %eax
		movl $10, %ebx
		mull %ebx
		addl (indice_x), %eax
		movl %eax, %esi
		
		cmpl $9, array(,%esi,4)
			ja no_marcada
			## Si la casilla estaba cerrada:
			## Dibujamos la bandera
			pushl (j)
			pushl (i)
			pushl $bandera
			pushl %eax
			call print_IMG
			addl $16, %esp
			
			addl $20, array(,%esi,4)
			jmp fin_boton
		no_marcada:
		cmpl $20, array(,%esi,4)
		jb fin_boton
		cmpl $29, array(,%esi,4)
		ja fin_boton
			## Si la casilla estaba marcada con bandera
			## Dibujamos la casilla cerrada
			pushl (j)
			pushl (i)
			pushl $cerrada
			pushl %eax
			call print_IMG
			addl $16, %esp
			
			subl $20, array(,%esi,4)
			jmp fin_boton

fin_boton:

	## Actualizamos la ventana	
	call update_screen

	jmp no_cierra_ventana
	
terminar:
	leave
	ret
# fin del programa
